package thread;

/**
 * 饿汉式单例(类加载时创建类的实例)
 * 应用场景：小对象(占用内容低),频繁用(这里调用方法不会阻塞)
 */
class Singleton01 {
    /**构造方法私有化*/
    private Singleton01(){}
    /**类加载时构建对象*/
    private static Singleton01 instance=new Singleton01();
    /**为外界提供一个可以访问单例对象的方法*/
    public static Singleton01 getInstance(){
        return instance;
    }
}
/**
 * 单线程懒汉式单例(延迟加载:对象在需要时去创建)
 * 应用场景：大对象(占用内存多),单线程,频繁用
 */
class Singleton02 {
    /**构造方法私有化*/
    private Singleton02(){}
    /**类加载时构建对象*/
    private static Singleton02 instance;
    /**为外界提供一个可以访问单例对象的方法*/
    public static Singleton02 getInstance(){
        if(instance==null){
            instance=new Singleton02();
        }
        return instance;
    }
}
/**
 * 多线程懒汉式单例(延迟加载:对象在需要时去创建)
 * 应用场景：大对象(占用内存多),单线程,频繁用
 */
class Singleton03 {
    /**构造方法私有化*/
    private Singleton03(){}
    /**类加载时构建对象*/
    private static Singleton03 instance;
    /**为外界提供一个可以访问单例对象的方法*/
    public static synchronized Singleton03 getInstance(){
        if(instance==null){
            instance=new Singleton03();
        }
        return instance;
    }
}
//.....

public class SingletonDemo01 {
    public static void main(String[] args) {
       for(int i=0;i<5;i++){
           new Thread(()->{
               for(int j=0;j<5;j++) {
                   Singleton03 singleton03=Singleton03.getInstance();
                   System.out.println(singleton03);
               }
           }).start();
       }
    }
}
